
package andre.grids.db.dataclasses;

import java.util.*;

/**
 *
 * @author andre
 */
public class DbLogEntry implements java.io.Serializable {
    
    public static final String CREATE_DIRECTORY = "CREATE_DIR";
    public static final String CREATE_FILE ="CREATE_FILE";
    public static final String UPDATE_FILE = "UPDATE_FILE";
    public static final String DELETE_FILE = "DELETE_FILE";
    public static final String DELETE_DIRECTORY = "DELETE_DIRECTORY";
    
    private Date entryDate;
    private String entryType;
    private String ownerHostName;
    private String entryValue;
    private String entryData;
    private boolean fileLog;
    private boolean dirLog;
    private byte[] rawData;
    
    
    /*
     * Este campos foram criados para acelerar as buscas no Db4O
     * Assim o peer pode buscar modificações mas pontuais
     * */
    private int dayOfYear;
    private int hour;
    private int minute;
    private int second;
    private int year;
    
    public DbLogEntry() { }

    public Date getEntryDate() {
        return entryDate;
    }

    public void setEntryDate(Date entryDate) {
        this.entryDate = entryDate;
        
        // atualiza os campos internos
        updateInternalDate(this);
    }

    public String getEntryType() {
        return entryType;
    }

    public void setEntryType(String entryType) {
        this.entryType = entryType;
    }

    public String getEntryValue() {
        return entryValue;
    }

    public void setEntryValue(String entryValue) {
        this.entryValue = entryValue;
    }

    public String getOwnerHostName() {
        return ownerHostName;
    }

    public void setOwnerHostName(String ownerHostName) {
        this.ownerHostName = ownerHostName;
    }

    public String getEntryData() {
        return entryData;
    }

    public void setEntryData(String entryData) {
        this.entryData = entryData;
    }

    public boolean isDirLog() {
        return dirLog;
    }

    public void setDirLog(boolean dirLog) {
        this.dirLog = dirLog;
        this.fileLog = !this.dirLog;
    }

    public boolean isFileLog() {
        return fileLog;
    }

    public void setFileLog(boolean fileLog) {
        this.fileLog = fileLog;
        this.dirLog = !this.fileLog;
    }    

    public int getDayOfYear() {
        return dayOfYear;
    }

    public int getHour() {
        return hour;
    }

    public int getMinute() {
        return minute;
    }

    public int getSecond() {
        return second;
    }

    public int getYear() {
        return year;
    }
    
    public byte[] getRawData() {
        return rawData;
    }

    public void setRawData(byte[] rawData) {
        this.rawData = rawData;
    }
    

    @Override
    public String toString() {
        return "[" + this.getEntryDate().toString() +"]\t"+ this.getEntryType() + "\t"+ this.getEntryValue() + "--" + this.getEntryData();
    }
    
    
    /**
     * Atualiza os campos dayOfYear, Hour, Minute e Second para refletir a data do objeto
     * Deve ser chamado toda vez que a data é alterada.
     * Foi declarado como private static final para acelerar a chamada e reduzir o tempo gasto.
     * @param entry
     */
    private static final void updateInternalDate(DbLogEntry entry) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(entry.entryDate);
        entry.dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
        entry.hour = cal.get(Calendar.HOUR_OF_DAY);
        entry.minute = cal.get(Calendar.MINUTE);
        entry.second = cal.get(Calendar.SECOND);
        entry.year = cal.get(Calendar.YEAR);
    }
    
    /**
     * Retorna um template com os dados prontos para busca
     * 
     * @param year O Ano do log
     * @param dayOfYear Dia do ano para buscar - Deve ser informado, caso contrário trará o log inteiro
     * @param hour Hora do dia para buscar - 0 para qualquer valor
     * @param minute Minuto para buscar - 0 para qualquer valor
     * @param second Segundo para buscar - 0 para qualquer valor
     * @return Um template que contém o padrão buscado nos logs
     */
    public static DbLogEntry getTemplate(int year, int dayOfYear, int hour, int minute, int second, boolean dirLog) {
        
        DbLogEntry template = new DbLogEntry();
        
        template.dayOfYear = dayOfYear;
        
        if (hour >= 0)
            template.hour = hour;
        if (minute >= 0)
            template.minute = minute;
        if (second >= 0)
            template.second = second;
        if (year >= 0)
            template.year = year;
        
        template.setDirLog(dirLog);
        
        return template;
    }
}
